package com.opensource.afuluo.ctx;

import com.opensource.afuluo.enums.ProcessStatus;

public interface Context {

    /**
     * 获取唯一识别符
     *
     * @return
     */
    String getUnique();

    /**
     * 获取配置
     *
     * @param clazz
     * @param <T>
     * @return
     */
    <T> T getConfig(Class<T> clazz);

    /**
     * 获取配置
     *
     * @param clazz
     * @param config
     * @param <T>
     * @return
     */
    <T> T getConfig(Class<T> clazz, String config);

    /**
     * 获取配置
     *
     * @param clazz
     * @param config
     * @param <T>
     * @return
     * @throws IllegalArgumentException
     */
    <T> T getConfigIfPresent(Class<T> clazz, String config) throws IllegalArgumentException;

    /**
     * 新增配置
     *
     * @param clazz
     * @param obj
     * @param <T>
     */
    <T> void setConfig(Class<T> clazz, Object obj);

    /**
     * 新增配置
     *
     * @param clazz
     * @param config
     * @param obj
     * @param <T>
     */
    <T> void setConfig(Class<T> clazz, String config, Object obj);

    /**
     * 新增配置
     *
     * @param clazz
     * @param config
     * @param obj
     * @param <T>
     * @throws IllegalArgumentException
     */
    <T> void setConfigIfAbsent(Class<T> clazz, String config, Object obj) throws IllegalArgumentException;

    /**
     * 是否有错
     *
     * @return
     */
    boolean hasError();

    /**
     * 是否成功
     *
     * @return
     */
    boolean isSuccess();

    /**
     * 是否被中断
     *
     * @return
     */
    boolean isInterrupted();

    /**
     * 是否为异步处理
     *
     * @return
     */
    boolean isReact();

    /**
     * 获取报错信息
     *
     * @return
     */
    String getError();

    /**
     * 设置状态
     *
     * @param status
     * @param msg
     */
    void setStatus(ProcessStatus status, String msg);

    /**
     * 标记React处理
     */
    void markReact(boolean react);

    /**
     * 生成子处理上下文
     *
     * @return
     */
    Context fork();

    /**
     * 获取父山下文
     * @return
     */
    Context getParent();

    /**
     * 获取父山下文
     * @return
     */
    void setParent(Context ctx);
}
